package org.example.util;


import lombok.Data;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;
import org.apache.pdfbox.util.Matrix;

import java.io.IOException;
import java.util.List;

/**
 * 关键字符串的四角坐标定位
 */
@Data
public class KeyWords {
    private String keyword;//关键字的值
    private float spaceLength;//一个空格的宽度
    private int currentPageNo;//当前坐标所在页码位置（从1开始计算）
    //不论坐标原点在左上还是左下，X坐标不变
    private float rightX;//右
    private float leftX;//左
    //左上角坐标原点0，0
    private float top_TopY;//左上
    private float top_BottomY;//左下
    //左下角坐标原点0，0
    private float down_TopY;
    private float down_BottomY;

    public KeyWords() {
    }

    /**
     * 指定页查询
     * Base【根据指定关键字在 指定页面 查找对应字符串 并解析该字符串的<四角定位坐标值> 左上、左下、右上、右下 坐标位置值】
     *
     * @param searchKeywords 要查询的关键字
     * @param accurateSearch 是否精确查询关键字
     * @param startPag       查询关键字起始页码（从1开始）
     * @param document       pdf文档对象
     * @throws IOException 异常
     */
    public KeyWords(String searchKeywords, boolean accurateSearch, int startPag, PDDocument document) throws IOException {
        this(searchKeywords, accurateSearch, startPag, startPag, document);
    }

    /**
     * 全页查询
     * Base【根据指定关键字在 指定页面 查找对应字符串 并解析该字符串的<四角定位坐标值> 左上、左下、右上、右下 坐标位置值】
     *
     * @param searchKeywords 要查询的关键字
     * @param accurateSearch 是否精确查询关键字
     * @param document       pdf文档对象
     * @throws IOException 异常
     */
    public KeyWords(String searchKeywords, boolean accurateSearch, PDDocument document) throws IOException {
        this(searchKeywords, accurateSearch, 1, document.getNumberOfPages(), document);
    }


    /**
     * Base【根据指定关键字在 指定页面 查找对应字符串 并解析该字符串的<四角定位坐标值> 左上、左下、右上、右下 坐标位置值】
     *
     * @param searchKeywords 要查询的关键字
     * @param accurateSearch 是否精确查询关键字
     * @param startPag       查询关键字起始页码（从1开始）
     * @param endPag         查询关键字结束页码
     * @param document       pdf文档对象
     * @throws IOException 异常
     */
    public KeyWords(String searchKeywords, boolean accurateSearch, int startPag, int endPag, PDDocument document) throws IOException {
        // 自定义PDFTextStripper类
        PDFTextStripper textStripper = new PDFTextStripper() {
            @Override
            protected void writeString(String text, List<TextPosition> textPositions) throws IOException {
                TextPosition startStr = null;
                TextPosition endStr = null;
                float widthDirAdj = textPositions.get(0).getWidth();//获取字符串中字符的宽度/高度（方块，宽高相同）
                if (accurateSearch) {//精确查询
                    if (text.equals(searchKeywords)) {
                        startStr = textPositions.get(0);
                        endStr = textPositions.get(textPositions.size() - 1);
                    }
                } else {//模糊查询
                    if (text.contains(searchKeywords)) {
                        int index = text.indexOf(searchKeywords);
                        startStr = textPositions.get(index);
                        endStr = textPositions.get(index + searchKeywords.length());
                    }
                }
                //四角定位
                if (startStr != null && endStr != null) {
                    keyword = text;
                    spaceLength = startStr.getWidthOfSpace();
                    currentPageNo = this.getCurrentPageNo();
                    leftX = startStr.getX();
                    rightX = endStr.getEndX();
                    top_TopY = startStr.getY() - widthDirAdj;
                    top_BottomY = startStr.getY();
                    Matrix textMatrix = startStr.getTextMatrix();
                    down_TopY = textMatrix.getTranslateY() + widthDirAdj;
                    down_BottomY = textMatrix.getTranslateY();
                }
                super.writeString(text, textPositions);
            }
        };
        // 设置处理页面范围
        textStripper.setStartPage(startPag);
        textStripper.setEndPage(endPag);
        // 获取文本内容及其坐标
        textStripper.getText(document);
    }


}









